#include <iostream>
#include <vector>
using namespace std;

#define MAX_ROW 10
#define MAX_COL 10


vector< vector<int> > data;

/*
 * Bandera de parada del backtracking.
 * Inicialmente en false.
 */ bool first_solution;

/* se le pueden agregar parametros que ayuden
 * a la resolucion de un problema determinado.
 */ void backtracking(int i , int j);

/*
 * Se avalúa si data es una solución.
 */ bool is_solution(int, int );

/*
 * procesar una solucion
 */ void process_solution();

/*
 * expandir alternativas a un estado que no es solucion.
 */ void get_candidates(int i, int j, vector<int> &candidates);

void add_candidate(int &i, int &j, int data);
void del_candidate(int &i, int &j, int data);

int main(){
	data.reserve(MAX_ROW);
	
	for(int i = 0; i < MAX_ROW; i++)
		data[i].reserve(MAX_COL);

	
	// USAR: data.push_back()
	// para cada caso de prueba usar data.clear()	
	return 0;
}

void backtracking(int i, int j){
	if(is_solution(i, j)){
		process_solution();
	}else{
		if(first_solution) return;
			
		vector<int> candidates;

		get_candidates(i, j, candidates);
		
		for(unsigned index = 0; index < candidates.size(); index++){
			add_candidate(i, j, candidates[index]);
			backtracking(i, j);
			del_candidate(i, j, candidates[index]); 
		}
	}
}

bool is_solution(int i, int j){
	//si corresponde hacer: first_solution = true;
	return false;
}

void process_solution(){
	cout << "solucion..." << endl;
}

void get_candidates(int i, int j, vector<int> &candidates){
}

void add_candidate(int &i, int &j, int n){
		// USAR: data.push_back()

}

void del_candidate(int &i, int &j, int n){
		// USAR: data.pop_back()

}
